é«åºŠãªã«ãŒãã£ã³ã°ãšå±¥æŽç®¡çæ©èœãåãããã¢ãã³ã§é«ããã©ãŒãã³ã¹ãªã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒãæ§ç¯ããããã®Navigation APIç·åã¬ã€ãã
Navigation APIããã¹ã¿ãŒããïŒã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã£ã³ã°ãšå±¥æŽç®¡ç
Navigation APIã¯ãã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒå ã§ã®ã«ãŒãã£ã³ã°ãšå±¥æŽç®¡çã®æ±ãæ¹ã«ãããéèŠãªé²æ©ã瀺ããŠããŸããåŸæ¥ã®æ¹æ³ã¯ããã°ãã°`window.location`ãªããžã§ã¯ãã®æäœããµãŒãããŒãã£ã®ã©ã€ãã©ãªã®å©çšã«äŸåããŠããŸããããããã®ã¢ãããŒãã¯ãããŸã§ååã«æ©èœããŠããŸããããNavigation APIã¯ããåçåãããããã©ãŒãã³ã¹ãé«ããæ©èœè±å¯ãªãœãªã¥ãŒã·ã§ã³ãæäŸããéçºè ããŠãŒã¶ãŒã®ããã²ãŒã·ã§ã³äœéšããã现ããå¶åŸ¡ã§ããããã«ããŸãã
Navigation APIãšã¯äœãïŒ
Navigation APIã¯ãSPAãããã²ãŒã·ã§ã³ãã«ãŒãã£ã³ã°ãå±¥æŽã管çããæ¹æ³ãç°¡çŽ åãã匷åããããã«èšèšãããææ°ã®ãã©ãŠã¶APIã§ããæ°ãã`navigation`ãªããžã§ã¯ããå°å ¥ããéçºè ãããã²ãŒã·ã§ã³ã€ãã³ããååã»å¶åŸ¡ããURLãæŽæ°ããããŒãžå šäœããªããŒãããããšãªãäžè²«ããé²èЧ履æŽãç¶æã§ããã¡ãœãããšã€ãã³ããæäŸããŸããããã«ãããããéããã¹ã ãŒãºã§ãå¿çæ§ã®é«ããŠãŒã¶ãŒäœéšãå®çŸããŸãã
Navigation APIã䜿çšããã¡ãªãã
- ããã©ãŒãã³ã¹ã®åäžïŒ ããŒãžå šäœã®åèªã¿èŸŒã¿ããªããããšã§ãNavigation APIã¯SPAã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããŸããç°ãªããã¥ãŒéã®é·ç§»ãããéããã¹ã ãŒãºã«ãªããããé åçãªãŠãŒã¶ãŒäœéšã«ã€ãªãããŸãã
- å¶åŸ¡ã®åŒ·åïŒ ãã®APIã¯ããã²ãŒã·ã§ã³ã€ãã³ãã«å¯Ÿãããã现ããå¶åŸ¡ãæäŸããéçºè ã¯å¿ èŠã«å¿ããŠããã²ãŒã·ã§ã³ã®æåãååãã倿Žããããšãã§ããŸããããã«ã¯ãããã²ãŒã·ã§ã³ã®é²æ¢ããŠãŒã¶ãŒã®ãªãã€ã¬ã¯ããããã²ãŒã·ã§ã³ã®ååŸã§ã®ã«ã¹ã¿ã ããžãã¯ã®å®è¡ãªã©ãå«ãŸããŸãã
- å±¥æŽç®¡çã®ç°¡çŽ åïŒ ãã©ãŠã¶ã®å±¥æŽã¹ã¿ãã¯ã®ç®¡çãNavigation APIã«ãã£ãŠå®¹æã«ãªããŸããéçºè ã¯ããã°ã©ã ã§å±¥æŽãšã³ããªã远å ã眮æãç§»åããããšãã§ããäžè²«æ§ã®ããäºæž¬å¯èœãªé²èЧäœéšãä¿èšŒããŸãã
- 宣èšçãªããã²ãŒã·ã§ã³ïŒ Navigation APIã¯ã«ãŒãã£ã³ã°ã«å¯Ÿãããã宣èšçãªã¢ãããŒããä¿é²ããéçºè ãããã²ãŒã·ã§ã³ã®ã«ãŒã«ãšåäœãæç¢ºãã€ç°¡æœãªæ¹æ³ã§å®çŸ©ã§ããããã«ããŸããããã«ãããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžããŸãã
- ã¢ãã³ãã¬ãŒã ã¯ãŒã¯ãšã®çµ±åïŒ Navigation APIã¯ãReactãAngularãVue.jsãªã©ã®ææ°ã®JavaScriptãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãšã·ãŒã ã¬ã¹ã«çµ±åã§ããããã«èšèšãããŠããŸããããã«ãããéçºè ã¯æ¢åã®éçºã¯ãŒã¯ãããŒå ã§APIã®æ©èœã掻çšã§ããŸãã
äžå¿çãªæŠå¿µãšæ©èœ
1. `navigation`ãªããžã§ã¯ã
Navigation APIã®äžå¿ã¯`navigation`ãªããžã§ã¯ãã§ãããã°ããŒãã«ãª`window`ãªããžã§ã¯ãïŒã€ãŸã`window.navigation`ïŒãä»ããŠã¢ã¯ã»ã¹ã§ããŸãããã®ãªããžã§ã¯ãã¯ãããã²ãŒã·ã§ã³ã«é¢é£ããããŸããŸãªããããã£ãã¡ãœãããžã®ã¢ã¯ã»ã¹ãæäŸããŸãã以äžãå«ãŸããŸãïŒ
- `currentEntry`: ããã²ãŒã·ã§ã³å±¥æŽã®çŸåšã®ãšã³ããªã衚ã`NavigationHistoryEntry`ãªããžã§ã¯ããè¿ããŸãã
- `entries()`: ããã²ãŒã·ã§ã³å±¥æŽã®ãã¹ãŠã®ãšã³ããªã衚ã`NavigationHistoryEntry`ãªããžã§ã¯ãã®é åãè¿ããŸãã
- `navigate(url, { state, info, replace })`: æ°ããURLã«ããã²ãŒãããŸãã
- `back()`: åã®å±¥æŽãšã³ããªã«æ»ããŸãã
- `forward()`: 次ã®å±¥æŽãšã³ããªã«é²ã¿ãŸãã
- `reload()`: çŸåšã®ããŒãžããªããŒãããŸãã
- `addEventListener(event, listener)`: ããã²ãŒã·ã§ã³é¢é£ã®ã€ãã³ããªã¹ããŒã远å ããŸãã
2. `NavigationHistoryEntry`
`NavigationHistoryEntry`ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããã²ãŒã·ã§ã³å±¥æŽå ã®åäžã®ãšã³ããªã衚ããŸããURLãç¶æ ãäžæã®IDãªã©ããšã³ããªã«é¢ããæ å ±ãæäŸããŸãã
- `url`: å±¥æŽãšã³ããªã®URLã
- `key`: å±¥æŽãšã³ããªã®äžæã®èå¥åã
- `id`: ããäžã€ã®äžæã®èå¥åã§ãç¹ã«ããã²ãŒã·ã§ã³ã€ãã³ãã®ã©ã€ããµã€ã¯ã«ã远跡ããã®ã«äŸ¿å©ã§ãã
- `sameDocument`: ããã²ãŒã·ã§ã³ãåäžããã¥ã¡ã³ãå ã®ããã²ãŒã·ã§ã³ã«ãªããã©ããã瀺ãããŒã«å€ã
- `getState()`: å±¥æŽãšã³ããªã«é¢é£ä»ããããç¶æ ãè¿ããŸãïŒããã²ãŒã·ã§ã³äžã«èšå®ãããŸãïŒã
3. ããã²ãŒã·ã§ã³ã€ãã³ã
Navigation APIã¯ãéçºè ãããã²ãŒã·ã§ã³ã®æåãç£èŠã»å¶åŸ¡ã§ããããã€ãã®ã€ãã³ããçºè¡ããŸãããããã®ã€ãã³ãã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- `navigate`: ããã²ãŒã·ã§ã³ãéå§ããããšãïŒäŸïŒãªã³ã¯ã®ã¯ãªãã¯ããã©ãŒã ã®éä¿¡ã`navigation.navigate()`ã®åŒã³åºãïŒã«çºè¡ãããŸããããã¯ãããã²ãŒã·ã§ã³ãªã¯ãšã¹ããååããåŠçããããã®äž»èŠãªã€ãã³ãã§ãã
- `navigatesuccess`: ããã²ãŒã·ã§ã³ãæ£åžžã«å®äºãããšãã«çºè¡ãããŸãã
- `navigateerror`: ããã²ãŒã·ã§ã³ã倱æãããšãïŒäŸïŒãããã¯ãŒã¯ãšã©ãŒãæªåŠçã®äŸå€ã«ããïŒã«çºè¡ãããŸãã
- `currentchange`: çŸåšã®å±¥æŽãšã³ããªã倿ŽããããšãïŒäŸïŒé²ããŸãã¯æ»ãããã²ãŒã·ã§ã³æïŒã«çºè¡ãããŸãã
- `dispose`: `replaceState`æäœäžã«å±¥æŽããåé€ããããªã©ã`NavigationHistoryEntry`ãå°éäžèœã«ãªã£ããšãã«çºè¡ãããŸãã
Navigation APIã«ããã«ãŒãã£ã³ã°ã®å®è£ ïŒå®è·µäŸ
ç°¡åãªSPAã§åºæ¬çãªã«ãŒãã£ã³ã°ãå®è£ ããããã«ãNavigation APIãã©ã®ããã«äœ¿çšãããã説æããŸããããããŒã ãã¢ããŠããã³ã³ã¿ã¯ãã®3ã€ã®ãã¥ãŒãæã€ã¢ããªã±ãŒã·ã§ã³ãèããŸãã
ãŸããã«ãŒãã®å€æŽãåŠçãã颿°ãäœæããŸãïŒ
function handleRouteChange(url) {
const contentDiv = document.getElementById('content');
switch (url) {
case '/':
contentDiv.innerHTML = 'Home
Welcome to the Home page!
';
break;
case '/about':
contentDiv.innerHTML = 'About
Learn more about us.
';
break;
case '/contact':
contentDiv.innerHTML = 'Contact
Get in touch with us.
';
break;
default:
contentDiv.innerHTML = '404 Not Found
Page not found.
';
}
}
次ã«ã`navigate`ã€ãã³ãã«ã€ãã³ããªã¹ããŒã远å ããŸãïŒ
window.navigation.addEventListener('navigate', (event) => {
const url = new URL(event.destination.url).pathname;
event.preventDefault(); // Prevent default browser navigation
const promise = new Promise((resolve) => {
handleRouteChange(url);
resolve(); // Resolve the promise after route handling
});
event.transition = promise;
});
ãã®ã³ãŒãã¯`navigate`ã€ãã³ããååãã`event.destination`ãªããžã§ã¯ãããURLãæœåºãããã©ãŠã¶ã®ããã©ã«ãããã²ãŒã·ã§ã³ã鲿¢ãã`handleRouteChange`ãåŒã³åºããŠã³ã³ãã³ããæŽæ°ãã`event.transition`ãããã¹ãèšå®ããŸãã`event.transition`ãèšå®ããããšã§ããã©ãŠã¶ãããŒãžãèŠèŠçã«æŽæ°ããåã«ã³ã³ãã³ãã®æŽæ°ãå®äºããã®ãåŸ ã€ããã«ãªããŸãã
æåŸã«ãããã²ãŒã·ã§ã³ãããªã¬ãŒãããªã³ã¯ãäœæã§ããŸãïŒ
Home | About | Contact
ãããŠããããã®ãªã³ã¯ã«ã¯ãªãã¯ãªã¹ããŒãã¢ã¿ããããŸãïŒ
document.addEventListener('click', (event) => {
if (event.target.tagName === 'A' && event.target.hasAttribute('data-navigo')) {
event.preventDefault();
window.navigation.navigate(event.target.href);
}
});
ããã«ãããNavigation APIã䜿çšããåºæ¬çãªã¯ã©ã€ã¢ã³ããµã€ãã«ãŒãã£ã³ã°ãèšå®ãããŸããããã§ããªã³ã¯ãã¯ãªãã¯ãããšãããŒãžå šäœããªããŒãããããšãªã`content` divã®ã³ã³ãã³ããæŽæ°ããããã²ãŒã·ã§ã³ã€ãã³ããããªã¬ãŒãããŸãã
ç¶æ 管çã®è¿œå
Navigation APIã§ã¯ãåå±¥æŽãšã³ããªã«ç¶æ ãé¢é£ä»ããããšãã§ããŸããããã¯ãããã²ãŒã·ã§ã³ã€ãã³ãéã§ããŒã¿ãä¿æããã®ã«åœ¹ç«ã¡ãŸããåã®äŸã倿ŽããŠãç¶æ ãªããžã§ã¯ããå«ããŠã¿ãŸãããã
`navigation.navigate()`ãåŒã³åºãéã`state`ãªããžã§ã¯ããæž¡ãããšãã§ããŸãïŒ
window.navigation.navigate('/about', { state: { pageTitle: 'About Us' } });
`navigate`ã€ãã³ããªã¹ããŒå ã§ã`event.destination.getState()`ã䜿çšããŠç¶æ ã«ã¢ã¯ã»ã¹ã§ããŸãïŒ
window.navigation.addEventListener('navigate', (event) => {
const url = new URL(event.destination.url).pathname;
const state = event.destination.getState();
event.preventDefault();
const promise = new Promise((resolve) => {
handleRouteChange(url, state);
resolve();
});
event.transition = promise;
});
function handleRouteChange(url, state = {}) {
const contentDiv = document.getElementById('content');
let title = state.pageTitle || 'My App'; // Default title
switch (url) {
case '/':
contentDiv.innerHTML = 'Home
Welcome to the Home page!
';
title = 'Home';
break;
case '/about':
contentDiv.innerHTML = 'About
Learn more about us.
';
break;
case '/contact':
contentDiv.innerHTML = 'Contact
Get in touch with us.
';
break;
default:
contentDiv.innerHTML = '404 Not Found
Page not found.
';
title = '404 Not Found';
}
document.title = title;
}
ãã®å€æŽãããäŸã§ã¯ã`handleRouteChange`颿°ã¯`state`ãã©ã¡ãŒã¿ãåãå ¥ããããã«ãªããããã䜿çšããŠããã¥ã¡ã³ãã®ã¿ã€ãã«ãæŽæ°ããŸããç¶æ ãæž¡ãããªãå Žåã¯ãããã©ã«ãã§ãMy Appãã«ãªããŸãã
`navigation.updateCurrentEntry()`ã®äœ¿çš
æã«ã¯ãæ°ããããã²ãŒã·ã§ã³ãããªã¬ãŒããã«çŸåšã®å±¥æŽãšã³ããªã®ç¶æ ãæŽæ°ãããå ŽåããããŸãã`navigation.updateCurrentEntry()`ã¡ãœããã䜿çšãããšããããå®è¡ã§ããŸããããšãã°ããŠãŒã¶ãŒãçŸåšã®ããŒãžã§èšå®ã倿Žããå Žåããã®å€æŽãåæ ããããã«ç¶æ ãæŽæ°ã§ããŸãïŒ
function updateUserSetting(setting, value) {
const currentState = navigation.currentEntry.getState() || {};
const newState = { ...currentState, [setting]: value };
navigation.updateCurrentEntry({ state: newState });
console.log('Updated setting:', setting, 'to', value);
}
// Example usage:
updateUserSetting('theme', 'dark');
ãã®é¢æ°ã¯çŸåšã®ç¶æ ãååŸããæŽæ°ãããèšå®ãããŒãžããŠãæ°ããç¶æ ã§çŸåšã®å±¥æŽãšã³ããªãæŽæ°ããŸãã
é«åºŠãªãŠãŒã¹ã±ãŒã¹ãšèæ ®äºé
1. ãã©ãŒã éä¿¡ã®åŠç
Navigation APIã¯SPAã§ã®ãã©ãŒã éä¿¡ãåŠçããããã«äœ¿çšã§ããããŒãžå šäœã®åèªã¿èŸŒã¿ãé²ããããã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒäœéšãæäŸããŸãããã©ãŒã éä¿¡ã€ãã³ããååãã`navigation.navigate()`ã䜿çšããŠURLãæŽæ°ããããŒãžå šäœããªããŒãããã«çµæã衚瀺ã§ããŸãã
2. éåææäœ
ããã²ãŒã·ã§ã³ã€ãã³ããåŠçããéãAPIããã®ããŒã¿ååŸãªã©ãéåææäœãå®è¡ããå¿ èŠãããå ŽåããããŸãã`event.transition`ããããã£ã䜿çšãããšãããã²ãŒã·ã§ã³ã€ãã³ãã«ãããã¹ãé¢é£ä»ããããšãã§ãããã©ãŠã¶ãããŒãžãæŽæ°ããåã«éåææäœãå®äºããã®ãåŸ ã€ããšãã§ããŸããäžèšã®äŸãåç §ããŠãã ããã
3. ã¹ã¯ããŒã«äœçœ®ã®åŸ©å
ããã²ãŒã·ã§ã³äžã«ã¹ã¯ããŒã«äœçœ®ãç¶æããããšã¯ãè¯ããŠãŒã¶ãŒäœéšãæäŸããããã«éèŠã§ããNavigation APIã¯ãå±¥æŽãæ»ã£ããé²ãã ãããéã«ã¹ã¯ããŒã«äœçœ®ã埩å ããã¡ã«ããºã ãæäŸããŸãã`NavigationHistoryEntry`ã®`scroll`ããããã£ã䜿çšããŠãã¹ã¯ããŒã«äœçœ®ãä¿åããã³åŸ©å ã§ããŸãã
4. ãšã©ãŒåŠç
ããã²ãŒã·ã§ã³äžã«çºçããå¯èœæ§ã®ãããšã©ãŒïŒãããã¯ãŒã¯ãšã©ãŒãæªåŠçã®äŸå€ãªã©ïŒãåŠçããããšãäžå¯æ¬ ã§ãã`navigateerror`ã€ãã³ãã䜿çšãããšããããã®ãšã©ãŒãé©åã«ãã£ããããŠåŠçããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããããŠãŒã¶ãŒã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããããã®ãé²ãããšãã§ããŸãã
5. ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ã
Navigation APIã䜿çšããŠSPAãæ§ç¯ããéã¯ãããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããèæ ®ããããšãéèŠã§ãããã©ãŠã¶ãNavigation APIããµããŒãããŠããªãå Žåã§ããã¢ããªã±ãŒã·ã§ã³ãæ£ããåäœããããšã確èªããŠãã ãããæ©èœæ€åºã䜿çšããŠ`navigation`ãªããžã§ã¯ãã®ååšã確èªããå¿ èŠã«å¿ããŠåŸæ¥ã®ã«ãŒãã£ã³ã°æ¹æ³ã«ãã©ãŒã«ããã¯ã§ããŸãã
åŸæ¥ã®ã«ãŒãã£ã³ã°æ¹æ³ãšã®æ¯èŒ
SPAã«ãããåŸæ¥ã®ã«ãŒãã£ã³ã°æ¹æ³ã¯ããã°ãã°`window.location`ãªããžã§ã¯ãã®æäœãã`react-router`ã`vue-router`ãªã©ã®ãµãŒãããŒãã£ã©ã€ãã©ãªã®äœ¿çšã«äŸåããŠããŸãããããã®æ¹æ³ã¯åºã䜿çšããã確ç«ãããŠããŸãããããã€ãã®å¶éããããŸãïŒ
- ããŒãžå šäœã®åèªã¿èŸŒã¿ïŒ `window.location`ãçŽæ¥æäœãããšãããŒãžå šäœã®åèªã¿èŸŒã¿ãããªã¬ãŒãããå¯èœæ§ããããããã¯é ãããŠãŒã¶ãŒäœéšã劚ããå¯èœæ§ããããŸãã
- è€éãïŒ åŸæ¥ã®æ¹æ³ã§å±¥æŽãšç¶æ ã管çããããšã¯ãç¹ã«å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãè€éã§ãšã©ãŒãçºçãããããªãå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®ãªãŒããŒãããïŒ ãµãŒãããŒãã£ã®ã«ãŒãã£ã³ã°ã©ã€ãã©ãªã¯ãç¹ã«ã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ããŒãºã«åãããŠæé©åãããŠããªãå Žåãå€§å¹ ãªããã©ãŒãã³ã¹ã®ãªãŒããŒãããã远å ããå¯èœæ§ããããŸãã
Navigation APIã¯ãã«ãŒãã£ã³ã°ãšå±¥æŽç®¡çã®ããã®ããåçåãããããã©ãŒãã³ã¹ãé«ããæ©èœè±å¯ãªãœãªã¥ãŒã·ã§ã³ãæäŸããããšã§ããããã®å¶éã«å¯ŸåŠããŸããããŒãžå šäœã®åèªã¿èŸŒã¿ããªãããå±¥æŽç®¡çãç°¡çŽ åããããã²ãŒã·ã§ã³ã€ãã³ãã«å¯Ÿãããã现ããå¶åŸ¡ãæäŸããŸãã
ãã©ãŠã¶ã®äºææ§
2024幎åŸåçŸåšãNavigation APIã¯ChromeãFirefoxãSafariãEdgeãå«ãææ°ã®ãã©ãŠã¶ã§è¯å¥œãªãµããŒãã享åããŠããŸããããããæ¬çªã¢ããªã±ãŒã·ã§ã³ã«Navigation APIãå®è£ ããåã«ãCan I useãªã©ã®ãªãœãŒã¹ã§ææ°ã®ãã©ãŠã¶äºææ§æ å ±ã確èªããããšã¯åžžã«è¯ãç¿æ £ã§ããå€ããã©ãŠã¶ã®ãµããŒããå¿ é ã®å Žåã¯ãããªãã£ã«ãŸãã¯ãã©ãŒã«ããã¯ã¡ã«ããºã ã®äœ¿çšãæ€èšããŠãã ããã
çµè«
Navigation APIã¯ãé«åºŠãªã«ãŒãã£ã³ã°ãšå±¥æŽç®¡çæ©èœãåãããã¢ãã³ã§é«ããã©ãŒãã³ã¹ãªSPAãæ§ç¯ããããã®åŒ·åãªããŒã«ã§ãããã®APIã®æ©èœã掻çšããããšã§ãéçºè ã¯ããéããã¹ã ãŒãºã§ãé åçãªãŠãŒã¶ãŒäœéšãåµé ã§ããŸããåæã®åŠç¿æ²ç·ã¯ãããåçŽãªå€ãæ¹æ³ã䜿çšããå Žåãšæ¯èŒããŠå°ãæ¥ãããããŸããããç¹ã«è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãããNavigation APIã®å©ç¹ã¯ãæè³ãã䟡å€ã®ãããã®ã«ããŸããNavigation APIãåãå ¥ããããªãã®SPAã®å¯èœæ§ãæå€§éã«åŒãåºããŸãããã